home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / prolog / brklyprl.lha / Comp / permvars.pl < prev    next >
Text File  |  1989-04-14  |  1KB  |  42 lines

  1.  
  2. /* Copyright (C) 1988, 1989 Herve' Touati, Aquarius Project, UC Berkeley */
  3.  
  4. /* Copyright Herve' Touati, Aquarius Project, UC Berkeley */
  5.  
  6. % Find all permanent variables
  7. permvars([Head|Body], Vars, Perms) :-
  8.     colvars(Head, HeadVars),
  9.     xpermvars(Body, [HeadVars,[],[]], [Vars,Half,Perms]), !.
  10.  
  11. xpermvars([], AllVars, AllVars).
  12.  
  13. % Disjunction:
  14. xpermvars([Dis|Rest], SoFar, Out) :-
  15.     Dis=(_;_), !,
  16.     disxpermvars(Dis, SoFar, NewSoFar),
  17.     xpermvars(Rest, NewSoFar, Out).
  18.  
  19. % Conjunction:
  20. xpermvars([A|Rest], SoFar, Out) :-
  21.     SoFar=[Vars, Half, Perms],
  22.     colvars(A, AVars),
  23.     intersectv(AVars, Half, P),
  24.     unionv(Perms, P, NewPerms), % Fresh variables at end of NewPerms.
  25.     unionv(AVars, Vars, NewVars),
  26.     newhalf(A, Half, NewVars, NewHalf),
  27.     NewSoFar=[NewVars, NewHalf, NewPerms],
  28.     xpermvars(Rest, NewSoFar, Out).
  29.  
  30.     % calculate new Half permanent set:
  31.     newhalf(A, Half, NewVars, Half) :-
  32.         escape_builtin(A), !.
  33.     newhalf(A, Half, NewVars, NewHalf) :-
  34.         unionv(NewVars, Half, NewHalf).
  35.  
  36.     disxpermvars((A;B), SoFar, Out) :- !,
  37.         xpermvars(A, SoFar, OutA),
  38.         disxpermvars(B, SoFar, OutB),
  39.         mapcar(unionv, OutA, OutB, Out). % Fresh vars at end of Perms.
  40.     disxpermvars(B, SoFar, Out) :-
  41.         xpermvars(B, SoFar, Out).
  42.